<head>
  <style> body { margin: 0; } </style>

  <script type="importmap">{ "imports": {
    "react": "https://esm.sh/react",
    "react-dom": "https://esm.sh/react-dom/client"
  }}</script>

<!--  <script type="module">import * as React from 'react'; window.React = React;</script>-->
<!--  <script src="../../src/packages/react-force-graph-3d/dist/react-force-graph-3d.js" defer></script>-->
</head>

<body>
  <div id="graph"></div>

  <script src="//unpkg.com/@babel/standalone"></script>
  <script type="text/jsx" data-type="module">
    import ForceGraph3D from 'https://esm.sh/react-force-graph-3d?external=react';
    import React, { useState, useEffect, useCallback } from 'react';
    import { createRoot } from 'react-dom';

    const DynamicGraph = () => {
      const [data, setData] = useState({ nodes: [{ id: 0 }], links: [] });

      useEffect(() => {
        setInterval(() => {
          // Add a new connected node every second
          setData(({ nodes, links }) => {
            const id = nodes.length;
            return {
              nodes: [...nodes, { id }],
              links: [...links, { source: id, target: Math.round(Math.random() * (id-1)) }]
            };
          });
        }, 1000);
      }, []);

      const handleClick = useCallback(node => {
        const { nodes, links } = data;

        // Remove node on click
        const newLinks = links.filter(l => l.source !== node && l.target !== node); // Remove links attached to node
        const newNodes = nodes.slice();
        newNodes.splice(node.id, 1); // Remove node
        newNodes.forEach((n, idx) => { n.id = idx; }); // Reset node ids to array index

        setData({ nodes: newNodes, links: newLinks });
      }, [data, setData]);

      return <ForceGraph3D
        enableNodeDrag={false}
        onNodeClick={handleClick}
        graphData={data}
      />;
    };

    createRoot(document.getElementById('graph'))
      .render(<DynamicGraph />);
  </script>
</body>